// 引用express模块

const express = require('express');

// 创建app应用对象
const app = express();

// 引入sha1 模块
const sha1 = require('sha1');

// 验证服务器的有效性
/**
 * 1. 微信服务气要知道开发者服务器
 * 2. 测试号 填写的服务器地址
 *  - 使用ngrok内网穿透
 *  http://32508ddc.ngrok.io // 内网穿透
 *  ./ngrok http 3000 // 运行ngrok
 *
 *
 3. 验证消息是否来自微信服务器
    1、 将参与微信加密签名的三个参数（timestamp，nonce，token）按照字典顺序排序并组合在一起形成一个数组
    2、 将数组里所有参数拼装成一个字符串，进行sha1加密
    3、 加密完成就生成一个signatrue，和微信发送过来的进行对比
        - 如果一样，说明消息来自微信，返回echostr给微信服务器
        - 如果不一样， 说明不是微信服务器发送的信息，返回error
 */

const config = {
    appID: 'wxb1a057986cc517ed',
    appsecret: '59e937215b7fa564bf12e749357c108d',
    url: 'http://32508ddc.ngrok.io',
    token: 'woaixuemeiayi1314'
}

app.use((req, res, next)=>{
   /* {
        signature: '728d841c542b4fa5df14ed7b7694c0e16b38efbd', // 微信加密签名
        echostr: '8303257311992670207', // 微信的随机字符串
        timestamp: '1559807985', // 微信的发送请求时间戳
        nonce: '2119798744' // 微信的随机数字
    }*/

    const {signature, echostr, timestamp, nonce} = req.query;
    const {token} = config;
    console.log(req.query);
    // 1按字典顺序排放
    const arr = [timestamp, nonce, token];
    const arrSort = arr.sort();
    console.log(arrSort);
    // 2加密
    const str = arr.join('');
    const sha1Str = sha1(str);
    console.log(sha1Str);
    // 3对比
    if(sha1Str === signature){
        res.send(echostr)
    }else{
        res.end('error');
    }
})

// 监听端口号
app.listen(8888, () => console.log('服务器启动成功了'));
